const bcrypt = require('bcryptjs')
const {getUserInfo} = require('../serve/user.serve')
const {phoneReg, pwdReg} = require('../utils')
const {SmCode} = require("../config/smcode");
const redis = require("../utils/redis");


//验证必填项是否填写
const userValidator = async (ctx, next) => {
    const {username, password, code} = ctx.request.body;
    if (!username || !password) {
        // 202: 已接受请求，但未处理完成
        ctx.status = 202
        ctx.body = {
            status: 1, msg: '用户名或密码为空'
        }
        return
    } else {
        // if (username && !phoneReg.test(username)) {
        if (!username) {
            ctx.status = 202
            ctx.body = {
                status: 1, msg: '用户手机号格式不正确'
            }
            return
        }
        // if (password && !pwdReg.test(password)) {
        if (!password) {
            ctx.status = 202
            ctx.body = {
                status: 1, msg: '密码长度为6-12位并且格式只能是字母、数字和下划线'
            }
            return
        }
    }
    // if (ctx.request.url === '/user/register') {
    //     if (!code) {
    //         ctx.status = 202
    //         ctx.body = {
    //             status: 1, msg: '验证码不能为空'
    //         }
    //         return
    //     }
    //     await new SmCode(ctx, username).codeFun();
    //     await new SmCode(ctx, username, code).verificationCode();
    // }
    await next()
}

const verifyUser = async (ctx, next) => {
    const {username} = ctx.request.body
    // 合理性
    const isRegistered = await getUserInfo({username})
    if (isRegistered) {
        // 冲突了
        ctx.body = {
            status: '1',
            msg: '用户已经存在'
        }
        return
    }
    await next()
}

const verifyLogin = async (ctx, next) => {
    const {username, password} = ctx.request.body
    let res
    try {
        // 1.判断用户是否存在
        res = await getUserInfo({username})
        console.log(res,'根据用户名查找到的结果');
        if (!res) {
            // 当用户被删除时，数据库已经查询不到该用户信息了，此时应该也删除该用户在redis里面的信息
            if(await redis.get(res.id)) {
                await redis.del(res.id)
            }
            console.log('未查询改用户')
            throw ({message: '未查询改用户'})
        }
        // 2.判断用户状态,如果关闭了用户状态，就不可以登录，所以当再redis里面有当年用户信息需要删除
        if (!res.status) {
            if(await redis.get(res.id)) {
                await redis.del(res.id)
            }
            throw({message: '登陆失败'})
        }
        // 3.密码是否匹配
        const isMatch = bcrypt.compareSync(password, res.password);
        if (!isMatch) {
            throw({message: '用户名或密码错误'})
        }
    } catch (err) {
        console.log(err);
        ctx.body = {
            status: 1,
            msg: err.message
        }
        return
    }
    ctx.userInfo = res
    await next()
}

const bcryptPassword = async (ctx, next) => {
    const {password} = ctx.request.body;
    let salt = bcrypt.genSaltSync(10);
    let hash = bcrypt.hashSync(password, salt);
    ctx.request.body.password = hash;
    await next();
}

module.exports = {
    userValidator, verifyUser, bcryptPassword, verifyLogin
}
